{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rX8mhOLljYeM"
      },
      "source": [
        "##### Copyright 2019 The TensorFlow Authors."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "BZSlp3DAjdYf"
      },
      "outputs": [],
      "source": [
        "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "# https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3wF5wszaj97Y"
      },
      "source": [
        "# <div dir=\"rtl\"> تمهيد سريع للمبتدئين حول Tensorflow-2</div>\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DUNzJc4jTj6G"
      },
      "source": [
        "<table class=\"tfo-notebook-buttons\" align=\"right\" dir=\"rtl\">\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://www.tensorflow.org/tutorials/quickstart/beginner?hl=ar\"><img src=\"https://www.tensorflow.org/images/tf_logo_32px.png\" />إفتح المحتوى على موقع TensorFlow.org</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://colab.research.google.com/github/tensorflow/docs-l10n/blob/master/site/ar/tutorials/quickstart/beginner.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" />تفاعل مع المحتوى على Google Colab</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a target=\"_blank\" href=\"https://github.com/tensorflow/docs-l10n/blob/master/site/ar/tutorials/quickstart/beginner.ipynb\"><img src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" />اعرض المصدر على Github</a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a href=\"https://storage.googleapis.com/tensorflow_docs/docs-l10n/site/ar/tutorials/quickstart/beginner.ipynb\"><img src=\"https://www.tensorflow.org/images/download_logo_32px.png\" />نزّل الدّفتر</a>\n",
        "  </td>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "04QgGZc9bF5D"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "يستخدم هذا التمهيد القصير \n",
        "[Keras](https://www.tensorflow.org/guide/keras/overview)\n",
        "من أجل:\n",
        "\n",
        "1. بناء شبكة عصبية تصنّف الصور.\n",
        "2. تدريب هذه الشبكة العصبية.\n",
        "3. وأخيرًا ، تقييم دقة النموذج.\n",
        "\n",
        "</div>\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hiH7AC-NTniF"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "هذا الملفّ هو دفتر \n",
        "[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb).\n",
        "بواسطته ، يمكنك تشغيل برامج Python مباشرة في المتصفّح - \n",
        "و هي طريقة رائعة لتعلّم و إستخدام Tensorflow.\n",
        "\n",
        " لمتابعة هذا البرنامج التعليمي ، قم بتشغيل الدفتر التّفاعلي في \n",
        " Google Colab\n",
        " بالنقر فوق الزر، ذي نفس التسمية ، الموجود في أعلى هذه الصفحة.\n",
        "\n",
        "1. في Colab ، اتصل بمحرّك تشغيل Python بالطريقة التّالية: إذهب إلى قائمة الإختيارات في أعلى يسار الدفتر ، ثمّ إضغط على *CONNECT*.\n",
        "2. شغّل كافة خلايا  الدفتر التّفاعلي بإختيار *Runtime* ثمّ الضغط على  *Run all*. \n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "nnrWf3PCEzXL"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "قم بتنزيل وتثبيت TensorFlow 2. ثمّ قم بإستيراد حزمة TensorFlow في برنامجك:\n",
        "\n",
        "Note: \n",
        "قم بتحديث \n",
        "pip\n",
        " لتتمكّن من تثبيت حزمة\n",
        "Tensorflow 2.\n",
        "أنظر في \n",
        "[دليل التثبيت](https://www.tensorflow.org/install)\n",
        "للحصول على المزيد من التفاصيل. \n",
        "\n",
        "</div>\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "0trJmd6DjqBZ"
      },
      "outputs": [],
      "source": [
        "import tensorflow as tf"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7NAbSZiaoJ4z"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "قم بتحميل و إعداد \n",
        "[قاعدة بيانات MNIST](http://yann.lecun.com/exdb/mnist/)\n",
        "  و تحويل العيّنات من أعداد صحيحة إلى أعداد الفاصلة العائمة\n",
        "(floating-point numbers):\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "7FP5258xjs-v"
      },
      "outputs": [],
      "source": [
        "mnist = tf.keras.datasets.mnist\n",
        "\n",
        "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
        "x_train, x_test = x_train / 255.0, x_test / 255.0"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "BPZ68wASog_I"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "قم ببناء نموذج\n",
        "`tf.keras.Sequential`\n",
        "عن طريق تكديس الطبقات.\n",
        "لتدريب النموذج قم بإختيار خوارزميّة تحسين \n",
        "(optimizer)\n",
        "و دالّة خسارة  \n",
        "(loss function).\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "h3IKyzTCDNGo"
      },
      "outputs": [],
      "source": [
        "model = tf.keras.models.Sequential([\n",
        "  tf.keras.layers.Flatten(input_shape=(28, 28)),\n",
        "  tf.keras.layers.Dense(128, activation='relu'),\n",
        "  tf.keras.layers.Dropout(0.2),\n",
        "  tf.keras.layers.Dense(10)\n",
        "])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "l2hiez2eIUz8"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "لكلّ مثال في قاعدة التّدريب، يعرض النّموذج متجّها \n",
        "(vector)\n",
        "متكوّنا من نتائج تمثّل \n",
        "[\"logits\"](https://developers.google.com/machine-learning/glossary#logits)\n",
        "أو\n",
        "[\"log-odds\"](https://developers.google.com/machine-learning/glossary#log-odds)\n",
        "كلُّ قيمة في هذا المتّجه تمثّل واحدة من الأقسام التّي نريد تصنيف الصّور حسبها.\n",
        "\n",
        "</div>\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "OeOrNdnkEEcR"
      },
      "outputs": [],
      "source": [
        "predictions = model(x_train[:1]).numpy()\n",
        "predictions"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tgjhDQGcIniO"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "تحول الدّالة \n",
        "`tf.nn.softmax`\n",
        " هذه النتائج ، المتمثلة في أعداد حقيقية ، إلى \"احتمالات\"\n",
        " لكل فئة ، حيث تكون قيمة كُلّ واحدة من هذه الإحتمالات بين 0 و 1\n",
        "و يساوي مجموع كُلّ القيم 1:\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "zWSRnQ0WI5eq"
      },
      "outputs": [],
      "source": [
        "tf.nn.softmax(predictions).numpy()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "he5u_okAYS4a"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "ملاحظة: يمكن جعل الدّالة \n",
        "`tf.nn.softmax`\n",
        "جزءًا من الشبكة العصبيّة التي بنيناها سابقا، حيث يمكن إعتبارها دالّة تنشيط \n",
        "(activation function)\n",
        "للطبقة الأخيرة من الشبكة العصبيّة. \n",
        "بهذه الطريقة ستصير نتيجة النموذج أكثر قابليّة للتفسير بشكل مباشر من دون معالجات إضافيّة. \n",
        "إلاّ أنّ هذه الطريقة غير منصوح بها ، لأنّه من المستحيل توفير حساب خسارة دقيق و مستقرّ رقميًّا لجميع النماذج عند إستخدام نتائج \n",
        "`softmax`.\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "hQyugpgRIyrA"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "تأخذ دالّة الخسار\n",
        "`losses.SparseCategoricalCrossentropy`\n",
        "متجّها متكوّنا من \n",
        "logits\n",
        "و مؤشرًا عن الفئة الصحيحة لكلّ مثال ، ثمّ تقوم بإنتاج عدد حقيقي يمثلّ قيمة الخسارة لكلّ مثال. \n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "RSkzdv8MD0tT"
      },
      "outputs": [],
      "source": [
        "loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "SfR4MsSDU880"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "تساوي قيمة هذه الخسارة القيمة السلبية اللوغاريتمية للإحتمال \n",
        "(negative log probability)\n",
        "الذّي أعطاه النموذج للفئة الصحيحة للمثال:\n",
        "تكون هذه القيمة قريبة من الصفر إذا كان النموذج متأكّدا من تصنيفه للمثال حسب الفئة الصحيحة.\n",
        "\n",
        "يعطي النموذج الحالي ، غير المدرّب ، إحتمالات عشوائيّة تقارب 1/10\n",
        "لكلّ فئة، لذا فإنّ قيمة الخسارة الأوليّة لهذا النموذج ستكون تقريبا\n",
        ":\n",
        "`tf.log(1/10) ~= 2.3`\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "NJWqEVrrJ7ZB"
      },
      "outputs": [],
      "source": [
        "loss_fn(y_train[:1], predictions).numpy()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "9foNKHzTD2Vo"
      },
      "outputs": [],
      "source": [
        "model.compile(optimizer='adam',\n",
        "              loss=loss_fn,\n",
        "              metrics=['accuracy'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ix4mEL65on-w"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "تقوم الدّالة\n",
        "`Model.fit`\n",
        "بضبط معلما\n",
        "(parameters)\n",
        "  النموذج لتقليل الخسارة:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "y7suUbJXVLqP"
      },
      "outputs": [],
      "source": [
        "model.fit(x_train, y_train, epochs=5)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "4mDAAPFqVVgn"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "تقوم الدّالة\n",
        "`Model.evaluate`\n",
        "بالتحقّق من أداء النّموذج على مجموعة بيانات معزولة عن تلك المستخدمة في التّدريب و تسمّى مجموعة التحقّق \n",
        "([Validation-set](https://developers.google.com/machine-learning/glossary#validation-set)).\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "F7dTAzgHDUh7"
      },
      "outputs": [],
      "source": [
        "model.evaluate(x_test,  y_test, verbose=2)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "T4JfEh7kvx6m"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "الآن ، و بعد إستخدام الدّالة \n",
        "`Model.fit`\n",
        "، تمّ تدريب مصنّف الصور إلى دقة 98% تقريبًا على مجموعة البيانات هذه.\n",
        "\n",
        " لتعلّم المزيد ، اقرأ \n",
        " [الدروس التعليمية](https://www.tensorflow.org/tutorials/)\n",
        " الأخرى على موقع\n",
        "TensorFlow.\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Aj8NrlzlJqDG"
      },
      "source": [
        "<div dir=\"rtl\">\n",
        "\n",
        "إذا أردت أن تكون نتائج النموذج المدرّب في شكل إحتمالات ، فيمكنك لفّه باستعمال الدّالة \n",
        "`tf.keras.Sequential`\n",
        "و إرفاقه بدالّة\n",
        "softmax:\n",
        "\n",
        "</div>"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "rYb6DrEH0GMv"
      },
      "outputs": [],
      "source": [
        "probability_model = tf.keras.Sequential([\n",
        "  model,\n",
        "  tf.keras.layers.Softmax()\n",
        "])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "cnqOZtUp1YR_"
      },
      "outputs": [],
      "source": [
        "probability_model(x_test[:5])"
      ]
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "collapsed_sections": [
        "rX8mhOLljYeM"
      ],
      "name": "beginner.ipynb",
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
